perm filename 106A10[1,RWF]1 blob sn#746001 filedate 1984-03-02 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00002 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	CS106
C00008 ENDMK
C⊗;
CS106


It's 10:00 P.M.  Do you know what lecture your instructor of introductory
programming is preparing?  

Thesis:

(1) The Dynamic Programming paradigm belongs in the introductory programming course.

    Examples: Best-match spelling correction, protein amino-acid sequence matching,
    change-making, parsing, triangulation, backgammon equities, locating large
    unobstructed regions, products of several matrices.

(2) Recursion as a paradigm (not merely as a language feature) belongs in the
    introductory programming course.

    Examples: Counting connected regions, rules of Go, adaptive integration,
    sorting, word frequency counting, dynamic programming.

(3) Program verification using invariants and well-ordering belongs in the
    introductory programming course.

    Examples: Elementary arithmetic, binary multiplication and exponentiation,
    Euclidean algorithm, sorting, binary search (very bug-prone if not verified),

(4) The Divide-and-Conquer paradigm belongs in the introductory programming course.

    Examples: binary search, merge sorting, word frequency counting, adaptive
    integration.

(5) Iterative refinement as a paradigm belongs in the introductory programming 
    course.

    Examples: Newton's square root algorithm without calculus; all valid  x←f(x)
    methods.

Just as student drivers should be aware that a headon collision can ruin your
whole day, programmers should learn the rationale for professionalism in
programming.  So:

(6) A set of professional standards for design and testing belongs in the
introductory programming course.

    (A) All code should be non-trivially executed.
    (B) All tests should be executed at their threshold values.
    (C) All inputs, iteration bounds, parameters, etc. should be tested at their
        extreme values.
    (D) Out-of-range input should be detected.
    (E) No system default error activity should be allowed to occur.
    (F) All interactive input should be logged.
    (G) All non-bulk input should be echoed. 
    (H) All computation should be reproducible.    
    (I) All physical limitations of the computing system (e.g., output page width)
        should be anticipated in the program.

     .
     .
     .
    (Z)
    (AA)
    (BB)
     .
     .
     .

(7) The introductory programming course should contain a full set of cautionary 
tales.

    Examples: The Cleveland tax base. The incoming Soviet nuclear moon.  For the
want of a comma, the missile was lost.  The Apollo altimeter.  The bill for $0.00.
The Vancouver Stock Exchange truncated index.  How to find  ln(2)  to zero
significant digits.  How to make one million mistakes per second.

(8) The introductory programming course should teach enough about numerical
precision in the small and in the large to alert the novice to potential hazards.

    Examples:  1 - 1/2 + 1/3 - 1/4 + ... - 1/10000, FOR I:0 STEP 2/3 TO 3 DO,
	APPROXDERIV:=1E6*(F(X + 0.000001) - F(X))

(9) The introductory programming course should make no effort to teach the entire
Pascal (or PL-I, or whatever) syntax and semantics.

    Examples: dynamic _own_ arrays, variant records, conformant gizmos,...